package com.lancoo.edu.platform.operation.commons.service.api;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.lancoo.edu.platform.operation.commons.domain.api.application.QueryIdentityModuleApiResp;
import com.lancoo.edu.platform.operation.commons.domain.api.code.Code2Info;
import com.lancoo.edu.platform.operation.commons.domain.api.user.*;
import com.lancoo.edu.platform.operation.commons.config.LancooConfig;
import com.lancoo.edu.platform.operation.commons.constant.base.BaseUrlConstant;
import com.lancoo.edu.platform.operation.commons.constant.base.ModuleUrlConstant;
import com.lancoo.edu.platform.operation.commons.utils.HttpUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

@Service
@Slf4j
public class UserInfoApiService extends YunBaseApiService {

    /**
     * 从基础平台获取用户信息（新版已作废）
     *
     * @param token token
     * @return 用户信息
     */
    public UserInfo getUserInfo(String token) {
        String url = baseUrl + "UserMgr/Login/Api/Login.ashx";
        Map<String, String> paramMap = new HashMap<>();
        paramMap.put("method", "GetUserInfo");
        paramMap.put("token", token);
        paramMap.put("params", LancooConfig.SYS_ID);
        String response = HttpUtil.sendGet(url, paramMap);
        if (StringUtils.isBlank(response)) {
            return null;
        }
        JSONObject resultJson = JSONObject.parseObject(response);
        if (resultJson.getInteger("error") != 0) {
            return null;
        }
        log.info("基础平台获取用户信息：" + resultJson);
        return resultJson.getJSONObject("data").toJavaObject(UserInfo.class);
    }

    /**
     * 退出应用登录API
     *
     * @param token 令牌
     * @param userId 用户ID
     * @return true/退出成功；false/退出失败
     */
    public Boolean logout(String token,String userId) {
        // java版基础平台
        if (beJavaBasePlatform()){
            String url = baseUrl + BaseUrlConstant.LOGIN_OUT;
            Map<String, String> paramsMap = getParamsMap();
            paramsMap.put("token",token);
            paramsMap.put("UserID",userId);
            paramsMap.put("DeviceType", LancooConfig.DEVICE_TYPE_PC);
            String resultStr = HttpUtil.sendPost(url,null,null, paramsMap);
            log.info("退出登录结果：" + resultStr);
            if (StringUtils.isNotBlank(resultStr)) {
                JSONObject resultJson = JSONObject.parseObject(resultStr);
                return resultJson.getInteger("Data") == 1;
            }
            return false;
        }
        String url = baseUrl + "UserMgr/Login/Api/Login.ashx";
        Map<String, String> paramMap = new HashMap<>();
        paramMap.put("method", "Logout");
        paramMap.put("token", token);
        paramMap.put("params", LancooConfig.SYS_ID);
        String resultStr = HttpUtil.sendGet(url, paramMap);
        log.info("退出登录结果：" + resultStr);
        if (StringUtils.isNotBlank(resultStr)) {
            JSONObject resultJson = JSONObject.parseObject(resultStr);
            return resultJson.getInteger("error") == 0;
        }
        return false;
    }

    /**
     * 获取用户身份信息
     * @param token 令牌
     * @return 用户身份信息
     */
    public UserIdentity getIdentityInfo(String token) {
        String url = baseUrl + "/BaseApi/Global/GetUserBaseIdentityInfo";
        Map<String, String> paramsMap = getParamsMap();
        paramsMap.put("login_token", token);
        String resultStr = HttpUtil.sendGet(url, paramsMap);
        // 设置json 反序列化类型，并提取data数据返回
        return getData2(resultStr, new TypeReference<Code2Info<UserIdentity>>(){});
    }

    /**
     * 获取所有类型用户类型列表
     * @param eduId 教育局ID
     * @return 用户类型列表
     */
    public List<AllTypeRsp> getAllTypeIdentity(String eduId){
        String url = baseUrl + "/BaseApi/UserMgr/PowerMgr/GetAllIdentity";
        Map<String, String> paramsMap = getParamsMap();
        paramsMap.put("EduID", eduId);
        String resultStr = HttpUtil.sendGet(url, paramsMap);
        return getData2(resultStr, new TypeReference<Code2Info<List<AllTypeRsp>>>(){});
    }

    /**
     * @param token 令牌
     * @return 结果
     */
    public OnlineUserInfo getOnlineUserInfo(String token){
        String url = baseUrl + "/BaseApi/Login/GetOnlineUserInfo";
        Map<String, String> paramsMap = getParamsMap();
        paramsMap.put("token", token);
        String resultStr = HttpUtil.sendGet(url, paramsMap);
        // 设置json 反序列化类型，并提取data数据返回
        return getData2(resultStr, new TypeReference<Code2Info<OnlineUserInfo>>(){});
    }

    /**
     * 根据用户ID获取其身份和可访问的模块列表
     *
     * @param userId 用户ID
     * @return 用户ID获取其身份和可访问的模块列表
     */
    public List<QueryIdentityModuleApiResp> getIdentityModule(String userId) {
        // 1、构建参数
        Map<String, String> paramsMap = getParamsMap();
        paramsMap.put("UserID", userId);
        paramsMap.put("ModuleID", "");
        paramsMap.put("ReturnModuleIDs", "0");
        // 2、请求URL
        String url = baseUrl + ModuleUrlConstant.GET_IDENTITY_MODULE_BY_USER_ID;
        // 3、请求
        try {
            String sendPost = HttpUtil.sendGet(url, paramsMap);
            // log.info("【根据用户ID获取其身份和可访问的模块列表请求基础平台接口成功：{}，返回：{}，参数：{}】", url, sendPost, paramsMap);
            return getDataList(sendPost, new TypeReference<Code2Info<List<QueryIdentityModuleApiResp>>>() {
            });
        } catch (Exception e) {
            log.error("【根据用户ID获取其身份和可访问的模块列表请求基础平台接口失败：{}，参数：{}】", url, paramsMap);
        }
        return new ArrayList<>();
    }

    /**
     * 获取用户详情
     * @param userId 用户ID
     * @param eduId 教育局ID
     * @param dataModel 数据结构，用于指定返回值的数据结构，可选值范围base\all，默认值为all，base：精简版数据结构，共4个字段，即[UserID、UserName、Gender、PhotoPath]
     * @return 用户信息
     */
    public List<UserDetail> getUserDetail(String userId, String eduId, String dataModel){
        String url = baseUrl + "/BaseApi/UserMgr/UserInfoMgr/GetUsers";
        Map<String, String> paramsMap = getParamsMap();
        paramsMap.put("userID", userId);
        paramsMap.put("eduID", eduId);
        paramsMap.put("dataModel", dataModel);
        String resultStr = HttpUtil.sendGet(url, paramsMap);
        // 设置json 反序列化类型，并提取data数据返回
//        return getData2(resultStr, new TypeReference<Code2Info<UserDetail>>(){});
        if (StringUtils.isBlank(resultStr)) {
            return new ArrayList<>();
        }
        try {
            JSONObject resultJson = JSONObject.parseObject(resultStr);
            if (resultJson.getInteger("StatusCode") == 200) {
                JSONArray data = resultJson
                        .getJSONArray("Data");
                if (Objects.nonNull(data)){
                    return data.toJavaList(UserDetail.class);
                }
            }
        }catch (Exception e){
            log.error("【获取指定用户所在部门失败：{}】",paramsMap,e);
        }
        return new ArrayList<>();
    }

    /**
     * 搜索用户
     * 添加分段获取
     *
     * @param eduId        教育局ID
     * @param userIds         用户ID串，英文逗号”,”分隔，精准匹配
     * @param usernameKeyword 单个用户名，模糊匹配
     * @return 用户列表
     */
    public List<SimpleUserInfoRsp> getUserInfoListByUserIds(String eduId, List<String> userIds, String usernameKeyword) {
        final List<SimpleUserInfoRsp> finalUserInfoList = new LinkedList<>();
        int begin = 0;
        while (begin < userIds.size()) {
            int end = (Math.min(begin + 100, userIds.size()));
            List<String> queryUserIds = userIds.subList(begin, end);
            Map<String, String> paramsMap = getParamsMap();
            String url = baseUrl + "/BaseApi/UserMgr/UserInfoMgr/SearchUserByIDsOrName";
            paramsMap.put("schoolID", eduId);
            paramsMap.put("userIDs", String.join(",", queryUserIds));
            paramsMap.put("userName", usernameKeyword);
            String resultStr = HttpUtil.sendGet(url, paramsMap);
            // 设置json 反序列化类型，并提取data数据返回
            finalUserInfoList.addAll(getDataList(resultStr, new TypeReference<Code2Info<List<SimpleUserInfoRsp>>>() {
            }));
            begin = begin + 100;
        }
        return finalUserInfoList;
    }

    /**
     * 通过教育局ID和身份代码获取用户信息（此方法为去除重复用户信息）
     *
     * @param eduId      教育局ID
     * @param identityCodes 身份代码串，多个用英文逗号隔开，如“IC0002,IC0003”
     * @param identityNames 身份名称串，多个用英文逗号隔开，如“学校领导,教务管理员”
     * @return 用户信息列表
     */
    public List<SimpleUserInfoRsp> getUserByIdentityCodes(String eduId, String identityCodes, String identityNames){
        String url = baseUrl + BaseUrlConstant.GET_USER_BY_IDENTITY_URL;
        Map<String, String> paramsMap = getParamsMap();
        paramsMap.put("EduID", eduId);
        paramsMap.put("IdentityCode", identityCodes);
        String resultStr = HttpUtil.sendGet(url, paramsMap);
        if (StringUtils.isNotBlank(resultStr)){
            JSONObject resultJson = JSONObject.parseObject(resultStr);
            JSONArray data = resultJson.getJSONArray("Data");
            if (resultJson.getInteger("StatusCode") == 200 && resultJson.getInteger("ErrCode") == 0 && data.size() > 0){
                // 总结果集
                ArrayList<SimpleUserInfoRsp> allUserList = new ArrayList<>();
                // 将身份代码插入到每个返回的用户信息中
                String[] identityCodeList = identityCodes.split(",");
                String[] identityNameList = identityNames.split(",");
                for(int i = 0; i < data.size(); i++) {
                    String identityCode = identityCodeList[i];
                    String identityName = identityNameList[i];
                    List<SimpleUserInfoRsp> identityUserList = data.getJSONArray(i).toJavaList(SimpleUserInfoRsp.class);
                    identityUserList.forEach(user -> user.setIdentityCode(identityCode));
                    identityUserList.forEach(user -> user.setIdentityName(identityName));
                    allUserList.addAll(identityUserList);
                }
                // 去除重复用户信息并返回
                return allUserList.stream().distinct().collect(Collectors.toList());
            }
        }
        return Collections.emptyList();
    }

    /**
     * 根据用户ID和学校ID搜索用户
     * @param userId 用户ID，多个用英文逗号”,”分隔，精准匹配
     * @param eduId 教育局ID
     * @return 用户信息
     */
    public List<SimpleUserInfoRsp> getUserById(String userId, String eduId, String keyword) {
        String url = baseUrl + BaseUrlConstant.SEARCH_USER;
        Map<String, String> paramsMap = getParamsMap();
        paramsMap.put("schoolID", eduId);
        paramsMap.put("userIDs", userId);
        paramsMap.put("userName", keyword);
        String resultStr = "";
        try {
            resultStr = cn.hutool.http.HttpUtil.createGet(url).formStr(paramsMap).execute().body();
            log.info("搜索用户信息：" + resultStr);
        }catch (Exception e){
            log.error("【请求失败】参数：{}",paramsMap,e);
        }
        return getDataList(resultStr, new TypeReference<Code2Info<List<SimpleUserInfoRsp>>>(){});
    }
}
